class Person {
	public String name; // 这是一个‘字段’,又叫field
	public int age; //a field
}
//上面的Person类,我定义了2个field
//将2个field汇聚到1个class上,实现了'数据封装'

//public是用来修饰field的,表示这个field可以被其他域访问


//再来一个Book类的定义
class Book {
	public String name;
	public String author;
	public String isbn;
	public double price;
}


//创建实例
//定义了class，只是定义了对象模版，而要根据对象模版创建出真正的对象实例，必须用new操作符。

Person xiaoming = new Person();
//上述代码创建了一个Person类型的实例Instance,并通过变量ming指向它。

//注意区分: Person ming是定义Person类型(Class)的变量ming，而new Person()是创建Person实例。

/*
上述两个变量分别指向两个不同的实例，它们在内存中的结构如下：

            ┌──────────────────┐
ming ──────>│Person instance   │
            ├──────────────────┤
            │name = "Xiao Ming"│
            │age = 12          │
            └──────────────────┘
            ┌──────────────────┐
hong ──────>│Person instance   │
            ├──────────────────┤
            │name = "Xiao Hong"│
            │age = 15          │
            └──────────────────┘
两个instance拥有class定义的name和age字段，且各自都有一份独立的数据，互不干扰。
*/



/*练习
请定义一个City类，该class具有如下字段:

name: 名称，String类型
latitude: 纬度，double类型
longitude: 经度，double类型
实例化几个City并赋值，然后打印。
*/
public class Main {
    public static void main(String[] args) {
        City bj = new City();//bj就是所谓的instance

        bj.name = "Beijing";
        bj.latitude = 39.903;
        bj.longitude = 116.401;

        System.out.println(bj.name);
        System.out.println("location: " + bj.latitude + ", " + bj.longitude);
    }
}

class City {
    public String name;
    public double latitude;
    public double longitude;
}


/*
小结
在OOP中，class和instance是“模版”和“基于模板的实体”的关系；

定义class就是定义了一种数据类型，对应的instance是这种数据类型的实例；

class定义的field，在每个instance都会拥有各自的field，且互不干扰；

通过new操作符创建新的instance，然后用变量指向它，即可通过变量来引用这个instance；

访问实例字段的方法是变量名.字段名；

指向instance的变量都是引用变量。

*/




